#!/usr/bin/env python3
"""
主程序入口

该文件整合了所有功能，提供统一的命令行接口。
"""

import argparse
import json
import sys
import os
from typing import Any

from config import DEFAULT_PARAMS
from tools.captcha_recognizer import recognize_captcha
from tools.get_captcha_picture import get_captcha, base64_to_image
from tools.phone_verify import PhoneVerifier, send_phone_verification_code, verify_phone_code
from task_workflow import get_vmids_by_ecmid
import get_vmid_to_data
from tools.log_util import INFO, ERROR


# 配置日志
# setup_logging()
# logger = logging.getLogger(__name__)

def save_to_file(data: Any, filename: str) -> None:
    """
    将数据保存到文件
    
    Args:
        data: 要保存的数据
        filename: 文件名
    """
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        INFO.logger.info(f"数据已保存到文件: {filename}")
    except Exception as e:
        ERROR.logger.error(f"保存文件失败: {e}")
        raise

def parse_args() -> argparse.Namespace:
    """
    解析命令行参数
    
    Returns:
        解析后的参数
    """
    parser = argparse.ArgumentParser(description='云天虚拟机数据获取工具')
    
    subparsers = parser.add_subparsers(dest='command', help='子命令')
    
    # 通过 EMC ID 获取虚拟机数据
    emc_parser = subparsers.add_parser('emc', help='通过 EMC ID 获取虚拟机数据')
    emc_parser.add_argument('--emc-id', type=int, default=DEFAULT_PARAMS['emc_id'], 
                           help=f'EMC ID，默认为 {DEFAULT_PARAMS["emc_id"]}')
    emc_parser.add_argument('--output', '-o', type=str, help='输出文件路径')
    
    # 通过 VMID 列表获取虚拟机数据
    vmid_parser = subparsers.add_parser('vmid', help='通过 VMID 列表获取虚拟机数据')
    vmid_parser.add_argument('--file', '-f', type=str, help='包含 VMID 列表的文件路径')
    vmid_parser.add_argument('--vmids', type=str, help='逗号分隔的 VMID 列表')
    vmid_parser.add_argument('--output', '-o', type=str, help='输出文件路径')
    
    # 验证码识别
    captcha_parser = subparsers.add_parser('captcha', help='验证码识别')
    captcha_parser.add_argument('--image', '-i', type=str, default='tools/captcha.png', 
                               help='验证码图片路径，默认为 tools/captcha.png')
    captcha_parser.add_argument('--fetch', '-f', action='store_true', 
                               help='是否获取新的验证码图片')
    captcha_parser.add_argument('--no-preprocess', action='store_true', 
                               help='不进行图片预处理')
    captcha_parser.add_argument('--method', '-m', type=str, choices=['tesseract', 'opencv', 'manual', 'auto'],
                               default='auto', help='验证码识别方法，默认为 auto')
    
    # 手机验证码
    phone_parser = subparsers.add_parser('phone', help='手机验证码操作')
    phone_subparsers = phone_parser.add_subparsers(dest='phone_command', help='手机验证码子命令')
    
    # 发送验证码
    send_parser = phone_subparsers.add_parser('send', help='发送手机验证码')
    send_parser.add_argument('phone_number', type=str, help='手机号码')
    send_parser.add_argument('--biz-type', type=int, default=10125, help='业务类型，默认为 10125')
    send_parser.add_argument('--user-type', type=int, default=999, help='用户类型，默认为 999')
    
    # 验证验证码
    verify_parser = phone_subparsers.add_parser('verify', help='验证手机验证码')
    verify_parser.add_argument('phone_number', type=str, help='手机号码')
    verify_parser.add_argument('code', type=str, help='验证码')
    verify_parser.add_argument('--biz-type', type=int, default=10125, help='业务类型，默认为 10125')
    verify_parser.add_argument('--user-type', type=int, default=999, help='用户类型，默认为 999')
    
    return parser.parse_args()

def main() -> None:
    """
    主函数
    """
    # setup_logging()
    # logger = logging.getLogger(__name__)
    args = parse_args()
    
    if args.command == 'emc':
        # 通过 EMC ID 获取虚拟机数据
        INFO.logger.info(f"正在获取 EMC ID {args.emc_id} 的虚拟机数据")
        result = get_vmids_by_ecmid.main(args.emc_id)
        
        if args.output:
            save_to_file(result, args.output)
            
    elif args.command == 'vmid':
        # 通过 VMID 列表获取虚拟机数据
        vmids_data = None
        
        if args.file:
            try:
                with open(args.file, 'r', encoding='utf-8') as f:
                    vmids_data = f.read()
            except Exception as e:
                ERROR.logger.error(f"读取文件失败: {e}")
                sys.exit(1)
        elif args.vmids:
            vmids_data = args.vmids
        else:
            # 使用默认的 VMID 列表
            vmids_data = get_vmid_to_data.VM_IDS_RAW_DATA
            
        INFO.logger.info("正在获取指定 VMID 的虚拟机数据")
        os_states, vmids_with_osstate_2 = get_vmid_to_data.main(vmids_data)
        
        if args.output:
            result = {
                'os_states': os_states,
                'vmids_with_osstate_2': vmids_with_osstate_2
            }
            save_to_file(result, args.output)
    
    elif args.command == 'captcha':
        # 验证码识别
        image_path = args.image
        
        # 如果需要获取新的验证码图片
        if args.fetch:
            INFO.logger.info("获取新的验证码图片")
            base64_str = get_captcha()
            image_path = base64_to_image(base64_str, output_path=image_path)
            INFO.logger.info(f"验证码图片已保存到: {image_path}")
        
        # 检查图片是否存在
        if not os.path.exists(image_path):
            ERROR.logger.error(f"验证码图片不存在: {image_path}")
            sys.exit(1)
            
        INFO.logger.info(f"开始识别验证码图片: {image_path}，方法: {args.method}")
        result = recognize_captcha(image_path, preprocess=not args.no_preprocess, method=args.method)
        
        if result:
            print(f"验证码识别结果: {result}")
        else:
            print("验证码识别失败")
            sys.exit(1)
    
    elif args.command == 'phone':
        if args.phone_command == 'send':
            # 发送手机验证码
            try:
                result = send_phone_verification_code(
                    args.phone_number,
                    args.biz_type,
                    args.user_type
                )
                print(f"发送结果: {json.dumps(result, ensure_ascii=False, indent=2)}")
            except Exception as e:
                ERROR.logger.error(f"发送验证码失败: {e}")
                sys.exit(1)
        
        elif args.phone_command == 'verify':
            # 验证手机验证码
            try:
                result = verify_phone_code(
                    args.phone_number,
                    args.code,
                    args.biz_type,
                    args.user_type
                )
                print(f"验证结果: {json.dumps(result, ensure_ascii=False, indent=2)}")
            except Exception as e:
                ERROR.logger.error(f"验证验证码失败: {e}")
                sys.exit(1)
        
        else:
            ERROR.logger.error("请指定手机验证码子命令: send 或 verify")
            sys.exit(1)
        
    else:
        # 如果没有指定子命令，显示帮助信息
        ERROR.logger.error("请指定子命令: emc, vmid, captcha 或 phone")
        sys.exit(1)

if __name__ == '__main__':
    main()
